home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / netmail / wsomr120.zip / WS.DAT / WSMAIL.C < prev    next >
C/C++ Source or Header  |  1996-04-24  |  8KB  |  340 lines

  1.  
  2. /*
  3.   ==========================================================================
  4.   wsmail.c ( ver 1.01 ) by Frank Wang, Copyright 1995 ( last: Jul. 15, 95 )
  5.  
  6.   Functions:
  7.  
  8.     1. Post reply packets created by wsOMR.
  9.     2. Retrieve mails from system mail box
  10.  
  11.   Usage:
  12.  
  13.     Compile this program in the internet side using ff. commands:
  14.       cc wsmail.c
  15.       mv a.out wsmail
  16.  
  17.     To send replies:
  18.       wsmail r file_name
  19.  
  20.     To send replies and delete the reply file after sending
  21.       wsmail r- file_name
  22.  
  23.     To retrieve mails from system mail box and move to a new file:
  24.       wsmail m file_name
  25.  
  26.     To retrieve mails from system mail box and append to a new/existing file
  27.       wsmail m+ file_name
  28.  
  29.     To retrieve mails from system mail box without deleting:
  30.       wsmail M file_name
  31.  
  32.       wsmail M+ file_name
  33.  
  34.     Note: This program assumes max character per line is 512.
  35.   ==========================================================================
  36. */
  37.  
  38. #include <stdlib.h>
  39. #include <stdio.h>
  40. #include <string.h>
  41. #include <memory.h>
  42. /* #include <sys/types.h> */
  43. #include <pwd.h>
  44.  
  45. #define MAX_NUM 512
  46. #define BUF_SIZE 512
  47. /*#define MAIL_SPOOL  "c:\\usenet\\"*/
  48. #define MAIL_SPOOL  "/usr/spool/mail/"
  49.  
  50. char *send_cmd  = "sendmail -t ";   /* change this in case different */
  51. char *temp_msg  = "temp.msg";       /* Temporary file for mail processed */
  52. char *wsomr_tag = "$WSOMR$";        /* Message seperating string         */
  53.  
  54. char user_mail[128];
  55. char home_dir[128];
  56.  
  57. /* -------------------------------- */
  58. /*  Read next line from the buffer  */
  59. /* -------------------------------- */
  60. next_line( f, buf, buf_siz, cnt, offset, ret_buf )
  61. FILE *f;
  62. char *buf;
  63. int buf_siz, *cnt, *offset;
  64. char *ret_buf;
  65. {
  66.   int ret = 0;
  67.  
  68.   memset( ret_buf, 0, buf_siz );
  69.   if (*offset < 0)                        /* first pass */
  70.   {
  71.     fseek( f, 0L, 0 );
  72.     *offset = *cnt = 0;
  73.   }
  74.   if (*offset == *cnt)                    /* at end of buffer ? */
  75.   {
  76.     memset( buf, 0, buf_siz );
  77.     *cnt = fread( buf, 1, buf_siz, f );   /* read the next block into buffer */
  78.     *offset = 0;
  79.   }
  80.   while ( *cnt > 0 )
  81.   {
  82.     int k, n;
  83.     char *p = buf + *offset;
  84.     for ( k = *offset, n = 0; *p && *p != '\n' && k < buf_siz; k ++, p++ )
  85.       n ++;
  86.  
  87.     /* If end of line or block */
  88.  
  89.     if ( k < buf_siz && (*p == '\n' || *p == 0) ) 
  90.     {
  91.       memcpy( ret_buf, buf + *offset, n );
  92.       ret_buf[n] = 0;
  93.       *offset = ++k;
  94.       ret = 1;
  95.       break;
  96.     }
  97.     else                                  /* The line is not ended in */
  98.     {                                     /* block, read the next block if any */
  99.       int new_siz = buf_siz - n;
  100.       memcpy( buf, buf + *offset, n );
  101.       memset( buf + n, 0, new_siz );
  102.       *cnt = fread( buf + n, 1, new_siz, f );
  103.       if ( *cnt == 0 )                    /* no more left in the file */
  104.       {                                   /* copy whatever left in the prv.blk*/
  105.         memcpy( ret_buf, buf + *offset, n );
  106.         ret_buf[n] = 0;
  107.       }
  108.       else
  109.       {
  110.         *cnt += n;
  111.         *offset = 0;
  112.       }
  113.     }
  114.   }
  115.   return ret;
  116. }
  117.  
  118. /* ------------------------------------------- */
  119. /*  Send mail using internet sendmail command  */
  120. /* ------------------------------------------- */
  121. send_mail( msg_no, to )
  122. int msg_no;
  123. char *to;
  124. {
  125.   int status;  char cmd[128];
  126.   sprintf( cmd, "%s <%s", send_cmd, temp_msg );
  127.   printf("\nMail # %2d, ", msg_no );
  128.   status  = system( cmd );
  129.   printf("Status: %s, To:%s", status ? "error":"sent",to );
  130. }
  131.  
  132. /* ------------------------------------------------------------- */
  133. /*  Scan wsOMR created reply file and send one mail at one time  */
  134. /* ------------------------------------------------------------- */
  135. post_all_mails( fname )
  136. char *fname;
  137. {
  138.   int ret = 0;
  139.   FILE *rep = fopen (fname, "rt");
  140.   if (NULL == rep )
  141.     fprintf (stderr, "can't open %s\n", fname );
  142.   else
  143.   {
  144.     FILE *out;
  145.     char buffer[MAX_NUM], ret_buf[MAX_NUM], name[128];
  146.     int cnt, offset = -1, done, msg_no, valid_msg, apnd, end_of_msg;
  147.     cnt = done = apnd = msg_no = valid_msg = end_of_msg = 0;
  148.     while (!done)
  149.     {
  150.       if (!apnd)
  151.       {
  152.         if (NULL == (out = fopen (temp_msg, "wt")))
  153.         {
  154.           fprintf (stderr, "can't create %s\n", temp_msg );
  155.           exit (0);
  156.         }
  157.         apnd = 1;
  158.         end_of_msg = valid_msg = 0;
  159.         memset( name, 0, sizeof(name) );
  160.       }
  161.       done = !next_line( rep, buffer, sizeof(buffer), &cnt, &offset, ret_buf );
  162.       if (!done)
  163.       {
  164.         if ( strncmp( ret_buf, wsomr_tag, strlen(wsomr_tag) ) )
  165.         {
  166.           fwrite( ret_buf, 1, strlen(ret_buf), out );
  167.           fwrite( "\n", 1, 1, out );
  168.           if (!valid_msg)
  169.           {
  170.             valid_msg = strncmp( ret_buf, "To:", 3 ) == 0;
  171.             if (valid_msg)
  172.               strcpy( name, ret_buf + 3 );
  173.           }
  174.         }
  175.         else
  176.           end_of_msg = 1;
  177.       }
  178.       if ( (apnd && valid_msg) && (done || end_of_msg) )
  179.       {
  180.         fclose( out );
  181.         msg_no ++;
  182.         send_mail( msg_no, name );
  183.         apnd = end_of_msg = valid_msg = 0;
  184.       }
  185.     }
  186.     if ( apnd )      /* invalid message encountered */
  187.       fclose( out );
  188.     unlink( temp_msg );
  189.     printf("\n");
  190.     fclose( rep );
  191.   }
  192.   return ret;
  193. }
  194.  
  195. /*
  196.   ---------------------------------------
  197.     Retrieve user info from UNIX system
  198.   ---------------------------------------
  199. */
  200. set_param()
  201. {
  202.   struct passwd *pw;
  203.   if (NULL == (pw = getpwuid(getuid())))
  204.   {
  205.     fprintf ( stderr, "can't determin user info\n");
  206.     return 0;
  207.   }
  208.   else
  209.   {
  210.     strcpy ( user_mail, MAIL_SPOOL );
  211.     strcat ( user_mail, pw -> pw_name );
  212.     strcpy ( home_dir,  pw -> pw_dir );
  213.     return 1;
  214.   }
  215. }
  216.  
  217. /*
  218.   --------------------------------------------------------
  219.     Move personal mail from system mail box to file_name
  220.   --------------------------------------------------------
  221. */
  222. get_mail( file_name, read_only, is_append )
  223. char *file_name;
  224. int read_only, is_append;
  225. {
  226.   int  done = 0;
  227.   long fsize = 0;
  228.   FILE *mail, *folder;
  229.   char *mode = is_append ? "ab" : "wb";
  230.  
  231.   /* Open user's mail file */
  232.   if (NULL == (mail = fopen (user_mail, "rb")))
  233.   {
  234.     fprintf ( stderr, "\ncan't open %s\n", user_mail );
  235.     return 0;
  236.   }
  237.   else
  238.   {
  239.     fseek( mail, 0L, 2 );
  240.     if ( !ftell(mail) )
  241.     {
  242.       fprintf ( stderr, "\nmail box is empty\n" );
  243.       fclose(mail);
  244.       return 0;
  245.     }
  246.     else
  247.       rewind(mail);
  248.   }
  249.  
  250.   if (NULL == (folder = fopen (file_name, mode )))
  251.   {
  252.     fprintf ( stderr, "\ncan't create %s\n", file_name );
  253.     return 0;
  254.   }
  255.  
  256.   /* Copy */
  257.   while (!done)
  258.   {
  259.     unsigned char buffer[BUF_SIZE];
  260.     int  rcount, wcount;
  261.     rcount = fread( buffer, 1, sizeof(buffer), mail );
  262.     done = rcount < sizeof(buffer);
  263.     wcount = fwrite( buffer,1, rcount, folder );
  264.     if ( wcount != rcount )
  265.     {
  266.       fprintf (stderr, "Error in writing file \n", file_name );
  267.       return 0;
  268.     }
  269.     fsize += wcount;
  270.   }
  271.   fclose (mail);
  272.   fclose (folder);
  273.  
  274.   if (!read_only)
  275.   {
  276.     if (NULL == (mail = fopen (user_mail, "wb")))
  277.       fprintf (stderr, "can't write %s\n", user_mail );
  278.     else
  279.       fclose (mail);
  280.   }
  281.   return (fsize);
  282. }
  283.  
  284. void syntax()
  285. {
  286.   printf( "Postman( ver.1.01 ) for wsOMR by Frank Wang\n" );
  287.   printf( "\nSyntax: wsmail [rm] file_name" );
  288.   printf( "\n        r  post reply(file_name)" );
  289.   printf( "\n        r- post reply(file_name) and delete afterwards" );
  290.   printf( "\n        m  copy mails to file_name" );
  291.   printf( "\n        m+ append mails to file_name" );
  292.   printf( "\n        M  copy mails(read only) to file_name" );
  293.   printf( "\n        M+ append mails(read only) to file_name" );
  294.   printf( "\n" );
  295. }
  296.  
  297. main( argc, argv )
  298. int argc;
  299. char *argv[];
  300. {
  301.   int ret = 1;
  302.   char *param, *file_name;
  303.  
  304.   if ( argc > 2 )
  305.   {
  306.     char optn, mode;
  307.     param     = argv[1];
  308.     file_name = argv[2];
  309.  
  310.     optn = param[0];
  311.     mode = param[1];    /* optional switch */
  312.  
  313.     if ( optn == 'r' )
  314.     {
  315.       post_all_mails( file_name );
  316.       if ( mode == '-' )
  317.         unlink( file_name );
  318.       ret = 0;
  319.     }
  320.     else if ( optn == 'm' || optn == 'M' )
  321.     {
  322.       if ( set_param() )
  323.       {
  324.         long siz = get_mail(file_name, optn == 'M', mode == '+' );
  325.         if ( siz > 0 )
  326.         {
  327.           printf( "\nmails packed into %s (%u characters)\n", file_name, siz );
  328.           ret = 0;
  329.         }
  330.       }
  331.     }
  332.     else
  333.       syntax();
  334.   }
  335.   else
  336.     syntax();
  337.   exit(ret);
  338. }
  339.  
  340.